<template>
  <div class="body">
    <div class="login">
      <el-form v-loading="loading" ref="loginForm" :model="loginForm" :rules="loginFormRule">
        <el-form-item prop="username">
          <el-input
            v-model="loginForm.username"
            clearable
            placeholder="请输入账号"
            prefix-icon="el-icon-user-solid"
          ></el-input>
        </el-form-item>
        <el-form-item prop="password">
          <el-input
            type="password"
            v-model="loginForm.password"
            clearable
            placeholder="请输入密码"
            prefix-icon="el-icon-lock"
          ></el-input>
        </el-form-item>
        <el-form-item>
          <el-button @click="login" style="width: 100%" type="primary"
            >登录</el-button
          >
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script>
import { login } from '../api'
export default {
  data () {
    // 自定义表单验证规则
    function validateUsername (rule, value, callback) {
      // 判断 value 必须是数字、字母、下划线
      if (/^\w{5,18}$/.test(value)) {
        callback()
      } else {
        callback(new Error('必须是数字、字母、下划线！'))
      }
    }

    return {
      loading: false, // 是否正在调用接口
      loginForm: {
        username: 'admin',
        password: '123456'
      },
      // 表单验证的规则
      loginFormRule: {
        username: [
          {
            validator: validateUsername,
            trigger: 'blur'
          }
        ],
        password: [
          { required: true, message: '密码不能为空！', trigger: 'blur' },
          {
            min: 5,
            max: 18,
            message: '密码长度必须是5~18位！',
            trigger: 'blur'
          }
        ]
      }
    }
  },
  methods: {
    login () {
      // 为了在普通函数中能够使用 this ，在这里需要先保存一下 this
      const _this = this

      // 先进行表单验证
      this.$refs.loginForm.validate(function (valid) {
        // 如果表单验证成功就提交
        if (valid) {
          // 先显示加载中
          _this.loading = true
          // 调用登录接口
          login(_this.loginForm.username, _this.loginForm.password)
            .then((res) => {
              if (res.code === 200) {
                // 放到 vuex 中
                _this.$store.commit('set_user', res.data)
                // 跳转到后台
                _this.$router.push({ name: 'Main' })
              }
            })
            .finally(() => {
              // 关闭加载中
              _this.loading = false
            })
        }
      })
    }
  }
}
</script>

<style lang="scss">
.body {
  background-size: contain;
  background-image: url("http://120.53.31.103:84/adminstyle/img/login_bg.1de8de0c.png");
  height: 100vh;
}
.login {
  width: 400px;
  height: 500px;
  position: absolute;
  top: 50%;
  left: 50%;
  // 向左、向上平移自身的50%
  transform: translate(-50%, -50%);
}
</style>
